package com.quanshu.change.tool;

import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;

/**
 * 作者  李哲
 * 创建时间 2018/8/28
 * 邮箱 lizhetongliao@163.com
 * 说明
 **/
public class AndroidBug5497Workaround {
    // For more information, see https://code.google.com/p/android/issues/detail?id=5497

    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.

    public static void assistActivity(Activity activity) {

        new AndroidBug5497Workaround(activity);

    }

    private View mChildOfContent;

    private int usableHeightPrevious;

    private FrameLayout.LayoutParams frameLayoutParams;


    private AndroidBug5497Workaround(Activity activity) {

        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id

                .content);

        mChildOfContent = content.getChildAt(0);

        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

            public void onGlobalLayout() {

                possiblyResizeChildOfContent();

            }

        });

        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();

    }

    private void possiblyResizeChildOfContent() {

        int usableHeightNow = computeUsableHeight();

        if (usableHeightNow != usableHeightPrevious) {

            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();

            int heightDifference = usableHeightSansKeyboard - usableHeightNow;

            if (heightDifference > (usableHeightSansKeyboard / 4)) {

                // keyboard probably just became visible

                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;

            } else {

                // keyboard probably just became hidden

                frameLayoutParams.height = usableHeightNow;

            }

            mChildOfContent.requestLayout();

            usableHeightPrevious = usableHeightNow;

        }

    }


    private int computeUsableHeight() {

        Rect r = new Rect();

        mChildOfContent.getWindowVisibleDisplayFrame(r);

        return (r.bottom - r.top);

    }

}
